#ifndef	ACL_LOADCFG_INCLUDE_H
#define	ACL_LOADCFG_INCLUDE_H

# ifdef	__cplusplus
extern "C" {
# endif

#include "acl_define.h"
#include "acl_array.h"

/**
 * 配置文件解析对象，动态数组保存指针指向各个ACL_CFG_LINE对象
 */
typedef struct ACL_CFG_PARSER ACL_CFG_PARSER;

/**
 * 配置文件行对象
 */
typedef struct ACL_CFG_LINE {
	char **value;	    /* store the separated values of the line by the delimiter */
	char *pdata;	    /* point to the beginning of the line data，如果是空行或者注释行指向行首去掉换行符 */
	int   ncount;	    /* how many values in this line data,
						 * if ncount == 0, then this is an
						 * invalid line, but still be stored
						 * here in pdata.
						 */
	int   line_number;	/* 该行在配置文件中的行号 */
} ACL_CFG_LINE;

typedef struct ACL_CFG_FN {
	const char  *name;
	int   (*func)(const ACL_CFG_LINE *);
} ACL_CFG_FN;

typedef void (*ACL_CFG_WALK_FN)(void *arg);

/**
 * acl_cfg_parser将整个配置文件分解读取出来
 * @param pathname {const char *} 文件名称
 * @param delimiter {const char *} 配置内容的分隔符
 */
ACL_API ACL_CFG_PARSER *acl_cfg_parser_load(const char *pathname, const char *delimiter);

/**
 * 销毁整个acl_cfg_parser
 */
ACL_API void acl_cfg_parser_free(ACL_CFG_PARSER *parser);

/**
 * 遍历每行配置文件内容，并将每行的ACL_CFG_LINE *cfg_line交给walk_fn使用
 */
ACL_API void acl_cfg_parser_walk(ACL_CFG_PARSER *parser, ACL_CFG_WALK_FN walk_fn);

/**
 * 将cfg_line->value[from]到cfg_line->value[to]的元素替换成value[0]到value[len]
 * 返回值是实际替换掉的元素个数
 */
ACL_API int acl_cfg_line_replace(ACL_CFG_LINE *cfg_line, const char **value, int from, int to);

/**
 * 按照实际行号取出ACL_CFG_LINE *cfg_line
 */
ACL_API ACL_CFG_LINE *acl_cfg_parser_index(const ACL_CFG_PARSER *parser, int idx);

/**
 * 取到配置文件总行数
 */
ACL_API int acl_cfg_parser_size(const ACL_CFG_PARSER *parser);

/**
 * 将原配置文件完整的写入到新的文件pathname中，分隔符使用delimiter
 */
ACL_API int acl_cfg_parser_dump(const ACL_CFG_PARSER *parser, const char *pathname, const char *delimiter);

/**
 * 构造ACL_CFG_LINE（非空行和注释行），const char **value是行内容会被拷贝出来，ncount指的是使用value中多少个元素
 */
ACL_API ACL_CFG_LINE *acl_cfg_line_new(const char **value, int ncount);

/**
 * 给配置文件添加一行内容，用户组织ACL_CFG_LINE *cfg_line内容
 */
ACL_API int acl_cfg_parser_append(ACL_CFG_PARSER *parser, ACL_CFG_LINE *cfg_line);

/**
 * 按照name（cfg_line->value[0]）要求删除第一个匹配到的行
 */
ACL_API int acl_cfg_parser_delete(ACL_CFG_PARSER *parser, const char *name);

# ifdef	__cplusplus
}
# endif

#endif

